Zprava z DLL knihovny

Otázka od: Pavel Poles

20. 10. 2002 1:43

Zdravim,

mam vytvorenou DLL knihovnu, z ktere volam funkci na zobrazeni Dialogoveho
Boxu:

procedure ZobrazChybu(index: integer);
begin
   MessageDlg('Chyba!',LoadStr(index), mtError, [mbOK],0);
end;

z klientske aplikace po zavolani se vse zobrazi jak ma, ale po vypnuti
hlavniho formulare zustane aplikace
'viset' v pameti... kde je chyba?

A druhy dotaz, takto se mi zobrazi MessageBox, ale neni vuci klientu
modalni, jak to zaridit??

Diky za odpovedi

Pavel Poles

Odpovedá: Petr Vones

21. 10. 2002 14:44

From: "Pavel Poles" <poles@student.fsid.cvut.cz>
> mam vytvorenou DLL knihovnu, z ktere volam funkci na zobrazeni Dialogoveho
> Boxu:
>
> procedure ZobrazChybu(index: integer);
> begin
> MessageDlg('Chyba!',LoadStr(index), mtError, [mbOK],0);
> end;

Patrne je to tim, ze DLL neni prelozena s runtime balicky, takze se v jednom
procesu nachazi dvakrat 'cela VCL', vcetne dvou instanci TApplication. Budto
preloz vsechno s balicky nebo pouzij Windows API funkci MessageBox pro ten
dialog.

> A druhy dotaz, takto se mi zobrazi MessageBox, ale neni vuci klientu
> modalni, jak to zaridit??

Viz predchozni odpoved, pokud to prelozis s balicky bude to fungovat jak ma, v
opacnem pripade musis do te DLL nejak predat Application.Handle z EXE.

Petr Vones

Odpovedá: pert_novaku@centrum.cz

6. 11. 2002 12:55

Mam asi velkou zacateznickou otazku, ale nedokozal jsem najit o tom
informace. Co znamena: prelozit s runtime balicky. Jak se tento
postup dela???

Dekuji... Petr


> Patrne je to tim, ze DLL neni prelozena s runtime balicky, takze se
v jednom
> procesu nachazi dvakrat 'cela VCL', vcetne dvou instanci
TApplication. Budto
> preloz vsechno s balicky nebo pouzij Windows API funkci MessageBox
pro ten
> dialog.


--------------------
Zapoj svoji osobnost.
http://user.centrum.cz/redir.php?url=http://www.nokiagame.cz


Odpovedá: Jan Sebelík

6. 11. 2002 15:29

> Odesílatel: pert_novaku@centrum.cz
> Mam asi velkou zacateznickou otazku, ale nedokozal jsem najit o tom
> informace. Co znamena: prelozit s runtime balicky. Jak se tento
> postup dela???

Odpovim jenom informativne, vice delame na kurzech (napr. 18.11., 9.12.).

Komponenty VCL jsou predevsim v nejakych zdrojovych unitach .pas.
Po prekladu unit vznikne .dcu.
Tyto .dcu jsou standardne prilinkovany k tvemu .exe.

Jenze v prostredi Delphi musi ty komponenty fungovat taky, abys je mohl polozit
v designu na formular a aby se ti po TTable.Active=true objevily data.

Jenze v prostredi Delphi to z dcu fungovat nebude. Musi to byt v
"design package". Package je v podstate DLL, ze ktere prostredi Delphi
komponenty spousti.

No a kdyz uz "design package", tak proc ne "runtime package"?

Pokud si v "Projekt / Options / Packages" zaskrtnes
"built with runtime packages", vznikly exe nebude obsahovat komponenty (jejich
.dcu), bude tedy mnohem mensi. Bude ale pouzivat uvedene runtime packages (zase
jsou to DLL), ktere si natahne pri startu programu.

To, ze je exe mnohem mensi, neni az tak dulezite (viz nedavna diskuse v
konferenci), tedy snad jenom tehdy, kdyz budu denne nekolikrat posilat emailem
testovaci verzi .exe svemu zadavateli.

Mnohem dulezitejsi je, ze se zbavis problemu, ktere znamena duplicitni
existence VCL v projektu:
Project1.exe, uses Forms, DBTables
Lib1.dll, uses Forms, DBTables.

Po spusteni Projekt1.exe je unita Forms, DBTables v pametovem prostoru projektu
duplicitne, to vcetne vsech globalnich promennych, VMT, class deskriptoru
pouzitych trid atd.

Nejde ani tak o pamet, ale o zmatek s vice instancemi globalnich promennych.
Kod Projektu pracuje s jinymi promennymi Application, Session, atd. nez kod
napsany v Dll. Tyto promenne z VCL pritom byly mysleny tak, ze budou v projektu
jenom jednou. Nejsou.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================